#pragma once

#include "wezel.h"
using namespace std;


//! Wezel drzewa
/*! 
   Klasa wezla drzewa. Jest to najwazniejsza klasa, zawierajaca wszystkie
podstawowe informacje, takie jak etykieta, pozycja itd. oraz metody do manipulowania poddrzewami.

*/
class Node 

{
protected:
	//!pozycja x wezla
	int X,
	//!pozycja y wezla
	Y,
	//!kolor czcionki wezla
	colour;
	//!szerokosc wezla  
	int Width,
	//! wysokosc wezla
	Height;
	//! informacja czy pole jest podswietlone	
	bool hightlighted;


	
	
	
public:
	//! informacja czy pole jest zaznaczone
	bool focus,
	//! informacja czy wezel ma notke
	hasNote,
	//! informacja czy wezel jest tylko do odczytu
	readOnly,link_z,
	//! informacja czy pole jest linkiem
	link;
	//! informacja po ktorej stronie drzewa sie znajduje
	bool strona;
	//! zwraca nastepnego brata
	Node *getNext(){return this->next;}
	//! zwraca poprzedniego brata
/*30.04 Pawel*/	Node *getPrevious(){return this->previous;}
	//! nazwa wezla
	string NodeName; 
	//! wskaznik na pierwszego syna
	Node *first;
	//! wskaznik na ostatniego syna
	Node *ostatnio;
	//! wskaznik na ojca
	Node *father;
	//! wskaznik na poprzedniego brat
	Node *previous;
	//! wskaznik na nastepnego brata
	Node *next;
	//! wskaznik na wczesniejszy zaznaczony wezel
	Node *last;
	//! konstruktor klasy 
	/*!
	\param Name nazwa wezla
	\param Colour kolor wezla
	*/
	Node(string Name,int Colour,bool Strona);
	//! konstruktor klasy
	Node();
	//! zwraca pozycje X
	int getX() {return X;};
	//! zwraca pozycje y
	int getY() {return Y;};
	//! ustawia pozycje x i y
	/*!
	\param ix pozycja x
	\param yy pozycja y
	*/
	void setXY(int ix, int yy){X=ix;Y=yy;};
	//! zwraca szerokosc wezla
	int getWidth() {return Width;} 
	//! zwraca wysokosc wezla
	int getHeight() {return Height;}; 
	//! ustawia wysokosc i szerokosc
	/*!
	\param w szerokosc
	\param h wysokosc
	*/
	void setWH(int w,int h){Width=w;Height=h;};
	//! zwraca kolor
	int getColour() {return colour;};
	void setColour(int Colour) {colour = Colour;};
	//! zwraca nazwe wezla
	string getNodeName() {return NodeName;} ;
	//! zmienia nazwe wezla
	/*!
	\param newNodeName nazwa wezla
	*/
	void changeNodeName(string newNodeName);
	
	void changeColour(int Colour) { colour=Colour;};
	void moveRoot(int dX,int dY) {X+=dX;Y=dY;};
	string GetNote();
	void changeNote(string newNote);
	bool getFocus(){return focus;};
	Node *getFather(){return this->father;};
/*3.05 Pawel*/	bool getZaznaczenie(){return this->hightlighted;};
/*3.05 Pawel*/	void setZaznaczenie(bool z){ this->hightlighted=z;};

	void addChild(string Name,Node *n,bool zp=true);
	void addBrother(string Name,Node *n,bool zp=true);

	Node* inRight();
	Node* inLeft();
	Node* inUp();
	Node* inDown();
	int moveTreeUp(Node *n);
	void uncheck();
/*30.04*/	void rozszerzanie(Node *n,int h,int typ=0);		
	void visibility();
	bool getVisible(){return visible;};
	bool visible; 
	Node* remove();
    void zwezanie(int typ,int gora,int dol);
	int max();
	int min();
	void wzgledna(int x,int y);
	void bezwzgledna(int x,int y);
	void setInvisible();
	void setVisible();

	Node* check(Node *n, int x, int y);
	Node* kropoZnajdowacz(Node *n, int x, int y);

        void nodeUp();
	void nodeDown();
	void nodeLeft();
	void moveY(int y);
	void moveX(int x);
	void move(int x,int y);

	void mirror();
	void setStrona(bool s);

	~Node(void);
	
};
